package com.leetcode.bfs;

public class Leetcode200 {
    public int numIslands(char[][] grid) {
        int count = 0;
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[0].length; j++) {
                if (grid[i][j] == '1') {
                    count++;
                    dfs(i, j, grid);
                }
            }
        }
        return count;
    }

    // grid 中的值如果是0,表示为海洋，如果是1,就是陆地，如果是2表示被访问过的陆地
    private void dfs(int r, int c, char[][] grid) {
        // base case == > 结束条件
        // 1.边界
        if (inArea(grid, r, c)) {
            return;
        }
        // 2.遍历到海洋或者已经被遍历了
        if (grid[r][c] == '0' || grid[r][c] == '2') {
            return;
        }
        grid[r][c] = '2';
        // 遍历 --> 对上下左右四个方向的值进行遍历
        dfs(r-1, c, grid);
        dfs(r+1, c, grid);
        dfs(r, c - 1, grid);
        dfs(r, c + 1, grid);
    }

    // 边界条件
    private boolean inArea(char[][] grid, int r, int c) {
        return r < 0 || r >= grid.length || c < 0 || c >= grid[0].length;
    }
}
